//在一个数组 nums 中除一个数字只出现一次之外，其他数字都出现了三次。请找出那个只出现一次的数字。
//
//
//
// 示例 1：
//
// 输入：nums = [3,4,3,3]
//输出：4
//
//
// 示例 2：
//
// 输入：nums = [9,1,7,9,7,9,7]
//输出：1
//
//
//
// 限制：
//
//
// 1 <= nums.length <= 10000
// 1 <= nums[i] < 2^31
//
//
//
//
// Related Topics 位运算 数组 👍 453 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function singleNumber(nums: number[]): number {
    //? 总体思路：考虑数字的二进制形式，对于出现三次的数字，各 二进制位 出现的次数都是 3的倍数。
    //? 因此，统计所有数字的各二进制位中 1 的出现次数，并对 3 求余，结果则为只出现一次的数字。
    let res = 0;

    for (let i = 0; i < 32; i++) {
        let count = 0;
        //? 对每个数的每个位上的1进行统计
        for (let j = 0; j < nums.length; j++) {
            //? 对于每一个数 右移i位 得到该位上是否为1
            if ((nums[j] >> i & 1) == 1) {
                count++;
            }
        }

        //? 找到取余不为0的数(即没有出现三次，那么必然只出现一次 为1)，并左移，为了将这一位循环结束后移至原位(为后面的腾位置 因为左移直接赋0)
        if (count % 3 !== 0) {
            res = res | 1 << i;
        }
    }

    return res;
};

//leetcode submit region end(Prohibit modification and deletion)
